//
// 名称：FFCache
// 注释：缓存静态类，包括数据库缓存与文件缓存。
// 作者：william zhao
// 日期：2013-09-30
//

#import <Foundation/Foundation.h>

/*!
 *  缓存类型
 */
typedef enum {
    FFCacheTypeNone = 0,
    FFCacheTypeAPI,
    FFCacheTypeImage,
    FFCacheTypeStartupAd,
    FFCacheTypeStatistics,
    FFCacheTypeTodayLike,
    FFCacheTypeRegions,
    FFCacheTypeSearchHistory,//搜索历史
    FFCacheTypeUserAddressList,
    FFCacheTypeHomeData
} FFCacheType;

#define DEFAULT_KEY_Females @"femalesDefaultKey"
#define DEFAULT_KEY_Males @"malesDefaultKey"
#define SEARCH_GENDER @"search_gender" //女士=1 男士=2
#define HOME_DATAS @"HomeDatas"

#define HOME_ITEMS @"homeItems"
#define HOME_ITEMS_VERSION @"homeItemsVERSION"

#define HAD_NEWCOUPON @"newCoupon"
#define KEYREGIONS @"REGIONS"           //行政区域

#define KEYUSERLOCATION @"USERLOCATION"

#define USER_INFO @"UserInfo"

#define USER_ADDRESS @"UserInfoAddresses"

#define USER_TOKEN @"TOKEN"

#define USER_ACCOUNT @"USERNAME"

#define DESIGNERS @"Designers" //设计师

#define DESIGNERS_MAN @"designer_man"
#define DESIGNERS_WOMAN @"designer_woman"

#define DISCOUNT @"DISCOUNT" //折扣

#define USER_PW @"PASSWORD"

#define CHAT_ACCOUNT @"chatAccount"
#define CHAT_PW @"chatPw"

#define SEARCH_HISTORY_PRODUCT [NSString stringWithFormat:@"%@searchProductHistory",((FFUserInfo *)[FFCache queryCache:USER_INFO]).phone]
#define SEARCH_HISTORY_INFORMATION [NSString stringWithFormat:@"%@searchInformationHistory",((FFUserInfo *)[FFCache queryCache:USER_INFO]).phone]
#define SEARCH_HISTORY_TOPIC [NSString stringWithFormat:@"%@searchTopicHistory",((FFUserInfo *)[FFCache queryCache:USER_INFO]).phone]

#define TABAR_SELECT_COLOR @"tabarTitleSelectColor"
#define TABAR_DEFAULT_COLOR @"tabarTitleDefaultColor"
/*!
 *  缓存策略
 */
@interface FFCachePolicy : NSObject<NSCopying>

+(id)cachePolicyWithCacheType:(FFCacheType)cacheType;

-(id)initWithCacheType:(FFCacheType)cacheType;

/*!
 *  缓存类型
 */
@property(nonatomic, assign) FFCacheType cacheType;

/*!
 *  失效日期
 */
@property(nonatomic, strong) NSDate* expDate;

/*!
 *  是否使用文件缓存
 */
@property(nonatomic, assign) BOOL useFileCache;

@end

/*!
 *  缓存管理类
 */
@interface FFCache : NSObject

/*!
 *  创建数据库
 */
+ (void)createDataBase;

/*!
 *  查询缓存
 *
 *  @param key key
 *
 *  @return 返回某类型的所有数据。如果缓存不存在或已经失效，返回nil
 */
+ (id)queryCache:(NSString *)key;

/*!
 *  查询缓存，返回某类型的所有数据
 *
 *  @param type FFCacheType-缓存类型
 *
 *  @return 返回某类型的所有数据
 */
+ (NSArray *)queryCacheForType:(FFCacheType)type;

/*!
 *  查询缓存，返回某类型的所有数据
 *
 *  @param type     FFCacheType-缓存类型
 *  @param maxCount 最大返回数量
 *
 *  @return 返回某类型的所有数据
 */
+ (NSArray *)queryCacheForType:(FFCacheType)type maxCount:(NSInteger)maxCount;

/*!
 *  查询某类型数据条数
 *
 *  @param type FFCacheType-缓存类型
 *
 *  @return 某类型数据条数
 */
+ (NSInteger)queryCacheCountForType:(FFCacheType)type;

/*!
 *  缓存数据的路径
 *
 *  @return 缓存数据的路径
 */
+ (NSString *)dbPath;

/*!
 *  清除图片缓存
 *
 *
 */
+ (void)clearCache;

/*!
 *  缓存量达到峰值，清除指定大小的图片缓存
 *
 *  @param maxsize    最大缓存量
 *  @param clearsize  删除的缓存量
 *
 */
+ (void)clearCacheWithMaxSize:(long)maxsize clearSize:(long)clearsize;

/*!
 *  缓存数据的锁
 *
 *  @return 缓存数据的锁
 */
+ (NSLock *)dbLock;

/*!
 *  添加缓存
 *
 *  @param key key
 *  @param obj object
 */
+ (void)addCache:(NSString *)key obj:(id <NSCoding>)obj;
/*!
 *  添加缓存
 *
 *  @param key    key
 *  @param obj    object
 *  @param policy 缓存策略
 */
+ (void)addCache:(NSString *)key obj:(id <NSCoding>)obj policy:(FFCachePolicy*)policy;
/*!
 *  添加缓存
 *
 *  @param key  key
 *  @param obj  object
 *  @param type FFCacheType-缓存类型
 */
+ (void)addCache:(NSString *)key obj:(id <NSCoding>)obj type:(FFCacheType)type;
/*!
 *  添加缓存
 *
 *  @param key     key
 *  @param obj     object
 *  @param type    FFCacheType-缓存类型
 *  @param expDate 失效日期
 */
+ (void)addCache:(NSString *)key obj:(id <NSCoding>)obj type:(FFCacheType)type expDate:(NSDate *)expDate;

/*!
 *  删除指定key缓存
 *
 *  @param key key
 */
+ (void)removeCacheForKey:(NSString *)key;

/*!
 *  删除指定type缓存
 *
 *  @param type FFCacheType-缓存类型
 */
+ (void)removeCacheForType:(FFCacheType)type;


/*!
 *  删除所有缓存
 */
+ (void)removeAllCache;
@end
